// Armor transparency
// Affects all parts

integer HUD_CHANNEL = -841511254;       // channel for HUD communications
string UPDATE_EYES_COMMAND = "update eyes";

integer CHANGE_TIME = 15;
float nChangeTimerFps = 10;
float nDistance = 0.0;

integer max_parts = 3;

// Convert a key to an integer using the first 8 hex digits (32 bits)
integer key2integer(key k) {
    return (integer)("0x" + llGetSubString((string)k, 0, 7));
}

integer channel() {
    return HUD_CHANNEL ^ key2integer(llGetOwner());
}

default
{
    state_entry()
    {
        llListen(channel(), "", NULL_KEY, "");
    }
        
    listen(integer chan, string name, key id, string msg)
    {
        if (llGetOwnerKey(id) != llGetOwner()) return;

        list parsed  = llParseString2List(msg, [";"], []);
        string command = llList2String(parsed, 0);

        if (command == UPDATE_EYES_COMMAND) {
            integer i;
            for (i = 1; i < llGetListLength(parsed); i+=2) {
                string param = llList2String(parsed, i);
                float  value = (float)llList2String(parsed, i+1);
                if (param == "derprange") {
                    if (value > 0.75) {
                        state goNightmare;
                    } else if ((value > 0) && (value < 0.55)) {
                        state goLuna;
                    }
                }
            }
        }        
        
    }

    on_rez(integer s)
    {
        llResetScript();
    }
}

state goNightmare
{
    state_entry()
    {
        llSetTimerEvent(1.0/nChangeTimerFps);
        nDistance = 0.0;
    }
    
    timer() 
    {

        nDistance+=1.0/(CHANGE_TIME*nChangeTimerFps);
        if (nDistance < 1.0) {
            if ((nDistance > 0.5) && (nDistance <= 1.0)) {
                integer idx;
                for (idx=0; idx<=max_parts; idx++) {
                    llSetLinkAlpha(idx, 1.0, ALL_SIDES);
                }
            }
        } else {
            state default;
        }
    }
}

state goLuna
{
    state_entry()
    {
        llSetTimerEvent(1.0/nChangeTimerFps);
        nDistance = 0.0;
    }
    
    timer() 
    {
        nDistance+=1.0/(CHANGE_TIME*nChangeTimerFps);
        if (nDistance < 1.0) {
            if ((nDistance > 0.5) && (nDistance <= 1.0)) {
                integer idx;
                for (idx=0; idx<=max_parts; idx++) {
                    llSetLinkAlpha(idx, 0.0, ALL_SIDES);
                }
            }
        } else {
            state default;
        }
    }
}
    
    